package fr.coupedumonde2014.app.service;

import android.util.Log;

import java.util.List;

import fr.coupedumonde2014.app.modele.Match;
import fr.coupedumonde2014.app.modele.Notification;
import fr.coupedumonde2014.app.modele.Utilisateur;
import retrofit.ErrorHandler;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;

public class IBetService {


    public class NetworkException extends Exception{} //Problème réseau
    public class LoginException extends Exception{} //Problème de login

    static Exception exception; //lors d'une exception, le ErrorHandlet est appellé, c'est dans ce cas que l'on stock l'erreur dans cette variable statique, vu qu'elle n'est pas throw

    /**
     * Renvoie une instance du IBetService
     */
    private static RetrofitService getGLPIService(){

        /**
         * Cette classe est appellée pour gérer les exceptions de Retrofit, dans ce cas nous modifions notre Exception statique en fonction du code d'erreur
         */
        class MyErrorHandler implements ErrorHandler {
            @Override public Throwable handleError(RetrofitError cause) {
                Response r = cause.getResponse();
                if (r != null && r.getStatus() == 401) { //si le code est 401, c'est que le server nous renvoie une UnauthorizedException
                    //exception = new UnauthorizedException(); //nous mettons dans ce cas le exception statique a UnauthorizedException
                }
                return cause;
            }
        }


        /**
         * Créé un RestAdapter, permettant de générer des WebSerives, relatifs à une URL, ici GLPIRetrofitService.ENDPOINT
         */
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(RetrofitService.URL) //l'URL du webservice
                .setLogLevel(RestAdapter.LogLevel.FULL) //Afficher toutes les actions
                .setLog(new RestAdapter.Log() { //gerer l'affichage des logs
                    @Override
                    public void log(String message) {
                        Log.d("service", message);
                    }
                })
                .setErrorHandler(new MyErrorHandler()) //gere les erreurs
                .build();

        RetrofitService service = restAdapter.create(RetrofitService.class); //Genere le client webservice

        return service;
    }

    public Utilisateur login(String userName, String password) throws NetworkException, LoginException  {
        try {
            return getGLPIService().login(userName, password); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            if(exception != null)
                throw new LoginException(); //Dans le cas d'une erreur de connexion, mot de passe ou login incorrecte
            else
                throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }

    public Utilisateur register(String userName, String password) throws NetworkException, LoginException  {
        try {
            return getGLPIService().register(userName, password); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            if(exception != null)
                throw new LoginException(); //Dans le cas d'une erreur de connexion, mot de passe ou login incorrecte
            else
                throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }

    public List<Match> matchs() throws NetworkException {
        try {
            return getGLPIService().matchs(); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }

    public List<Match> paris(String userId) throws NetworkException {
        try {
            return getGLPIService().paris(userId); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }

    public List<Notification> notifications(String userId) throws NetworkException {
        try {
            return getGLPIService().notifications(userId); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }

    public String parier(String userId, String matchId, String equipeId) throws NetworkException {

        try {
            return getGLPIService().parier(userId,matchId,equipeId); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            throw new NetworkException(); //Dans cas d'une erreur réseau
        }

    }

    public List<Utilisateur> classement() throws NetworkException  {
        try {
            return getGLPIService().classement(); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }


    public String envoyerJeton(String userId, String jeton) throws NetworkException  {
        try {
            return getGLPIService().envoyerJeton(userId,jeton); //appelle la méthode du webservice
        }catch (Exception e){
            e.printStackTrace();
            throw new NetworkException(); //Dans cas d'une erreur réseau
        }
    }

}
